
// 对话选项处理 ["动手吧！（战斗）",1003,"野猪"]

export async function execute(client_id, message_json) {
    let characters = G.Characters.get_current_login_characters(client_id);
    let map_id = characters["地图数据"]["编号"];
    // 校验客户端当前地图位置
    if (message_json[0] !== map_id) {
        ClientUtils.send_basic_prompt(client_id, "#R非法请求,与角色所在地图不匹配");
        return;
    }
    // 选项
    let select = message_json[1];
    // 校验标识数据
    if (message_json[2] && !_ClientDialogueDataFlag.has(client_id)) {
        ClientUtils.send_basic_prompt(client_id, "#R非法请求,服务端未下发该对话");
        return;
    }
    // 校验是否篡改标识数据
    let flag_data = undefined;
    if (message_json[2] && _ClientDialogueDataFlag.has(client_id)) {
        flag_data = _ClientDialogueDataFlag.get(client_id);
        if (message_json[2][0] !== flag_data[0] || message_json[2][1] !== flag_data[1] || message_json[2][2] !== flag_data[2]) {
            ClientUtils.send_basic_prompt(client_id, "#R非法请求,对话标识数据被篡改");
            return;
        }
    }
    // 系统对话框
    if (flag_data && flag_data[0] === 1 && flag_data[1] === 1 && flag_data[2] === "系统") {
        let handler_data = _DialogueHandlerData.get("system");
        let handler_fn = handler_data[select];
        if (handler_fn !== undefined) {
            await handler_fn(characters["id"]);
            return;
        }
    }
    // 是否为地图内固定NPC的对话
    if (flag_data && G.MapNpcData.default[map_id]) {
        let map_npc_obj = G.MapNpcData.default[map_id];
        let npc_number = flag_data[1];
        let npc_data = map_npc_obj[npc_number];
        // 地图固定NPC对话处理
        if (npc_data !== null && npc_data !== undefined) {
            let characters_map_id = characters["地图数据"]["编号"];
            let src_x = characters["地图数据"]["x"];
            let src_y = characters["地图数据"]["y"];
            // 如果要对话的npc与角色不在一个地图或距离过远则提示客户端
            if (Number(map_id) !== characters_map_id || G.MapUtils.check_point_distance(src_x, src_y, npc_data["x"], npc_data["y"], 170)) {
                ClientUtils.send_basic_prompt(client_id, "#Y/这个npc距离太远了");
                return;
            }
            //寻找对话处理函数
            let handler_data = _DialogueHandlerData.get(`${map_id}`);

            if (handler_data === undefined) {
                console.warn(`未定义地图[${map_id}]的对话处理流程`);
                return;
            }
            let npc_handler = handler_data[npc_number]
            if (npc_handler === undefined) {
                console.warn(`未定义地图[${map_id}]下NPC[${npc_number}]的对话处理流程`);
                return;
            }
            let handler_fn = handler_data[npc_number][select];
            if (handler_fn === undefined) {
                console.warn(`未定义地图[${map_id}]下NPC[${npc_number}]的选项对话处理, 选项内容: [${select}]`);
                return;
            }
            if (handler_fn !== undefined) {
                await handler_fn(characters["id"]);
                return;
            }
        } else {
            // 尝试寻找副本NPC对话处理
            if (get_dungeon_npc_dialogue_handler(client_id, characters, flag_data, select)) {
                return;
            }
            console.warn(`未找到地图[${map_id}]下的npc[${flag_data[2]}],请检查data/map_npc.js或副本对话文件`);
        }
    }
    else {
        // 尝试寻找副本NPC对话处理
        if (get_dungeon_npc_dialogue_handler(client_id, characters, flag_data, select)) {
            return;
        }
        console.warn(`未找到地图[${map_id}]下的npc数据,请检查data/map_npc.js`);
    }
}

function get_dungeon_npc_dialogue_handler(client_id, characters, flag_data, select) {
    let map_id = flag_data[0];
    let npc_number = flag_data[1];
    let npc_name = flag_data[2];
    // 地图内是否存在npc
    let map_data = G.MapUtils.get_map_data(map_id);
    if (!map_data.has(npc_number)) {
        ClientUtils.send_basic_prompt(client_id, "#R非法请求,当前地图不存在该NPC");
        return;
    }
    // 所有副本数据
    let all_dungeon_data = _CharactersDungeonData.get(characters["id"]);
    // 当前副本数据
    for (const key in all_dungeon_data) {
        let dungeon_data = all_dungeon_data[key];
        if (dungeon_data && dungeon_data["地图"] === map_id) {
            let handler_fns = _DialogueHandlerData.get(`${key}_${map_id}`);
            if (handler_fns && handler_fns[npc_name] && handler_fns[npc_name][select]) {
                // 执行对话处理函数
                handler_fns[npc_name][select](characters["id"]);
                return true;
            }
        }
    }
}